package com.webserver.core;

import com.webserver.annotation.Controller;
import com.webserver.annotation.RequestMapping;

import java.io.File;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/*
    用于维护所有业务请求与对应的业务处理类
    是用于供给DispatcherServlet处理请求时使用
 */
public class HandlerMapping {
    /*
        下面的Map用于保存请求路径与对应的业务处理
        key:请求路径，如：“/myweb/reg”
        value:对应的业务处理方法
     */
    private static Map<String,MethodMapping> requestMapping = new HashMap<>();

//    静态块：
    static {
    try {
        initRequestMapping();
    } catch (Exception e) {
        e.printStackTrace();
    }
}


    private static void initRequestMapping() throws Exception {
        //首先定位controller目录：
        File dir = new File(
                WebServerApplication.BootClass.getResource(
                        "./controller"
                ).toURI()
        );
        //再获取文件：
        File[] subs = dir.listFiles(f->f.getName().endsWith(".class"));
        //遍历文件：
        for (File file : subs){
            String className = file.getName().substring(0,
                    file.getName().indexOf("."));
            String packageName = WebServerApplication.BootClass.getPackage().getName();
            Class cls = Class.forName(packageName +".controller."+className);
            //判断该类是否被@Controller标注：
            if (cls.isAnnotationPresent(Controller.class)){
                //实例化反射：
                Object controller = cls.newInstance();
                //扫描所有被@RequestMapping标注的方法:
                Method[] methods = cls.getDeclaredMethods();
                for (Method method:methods){
                    //判断并获取被标注的类:
                    if (method.isAnnotationPresent(RequestMapping.class)){
                        //获取：
                        RequestMapping rm = method.getAnnotation(RequestMapping.class);
                        //获取到的类作为Map集合的value值：
                        String path = rm.value();
                        MethodMapping mm = new MethodMapping(controller,method);
                        requestMapping.put(path,mm);

                    }
                }
            }
        }

        System.out.println("==========>hh"+requestMapping.size());
        System.out.println("==========哈喽"+requestMapping);
    }



    /*
        根据请求获取某个Controller下使用注解@RequestMapping标注的
        处理该请求的方法
     */
    public static MethodMapping getRequestMapping(String path){
        return requestMapping.get(path);
    }


    public static class MethodMapping{

        //Method是处理某请求的业务方法，Object为该方法所属对象
        //作用是：以便反射机制调用时可直接调用，method.invoke(controller,...)
        private Object controller;
        private Method method;

        //用构造方法来传参数：
        public MethodMapping(Object controller, Method method) {
            this.controller = controller;
            this.method = method;
        }


        public Object getController() {
            return controller;
        }

        public void setController(Object controller) {
            this.controller = controller;
        }

        public Method getMethod() {
            return method;
        }

        public void setMethod(Method method) {
            this.method = method;
        }
    }

    public static void main(String[] args) {

    }
}
